#pragma once
#include <iostream>
#include <sys/select.h>
#include <vector>

class Select
{
private:
    int _maxfd;
    fd_set _rfds;
public:
    Select():_maxfd(-1)
    {
        FD_ZERO(&_rfds);
    }

    void Add(int sock)
    {
        FD_SET(sock,&_rfds);
        if(sock>_maxfd) 
        _maxfd=sock;
    }

    void Del(int sock)
    {
        FD_CLR(sock,&_rfds);
        for(int i=_maxfd;i>=0;i--)
        {
            if(FD_ISSET(i,&_rfds))
            {
                _maxfd=i;
                break;
            }
        }
    }

    bool Wait(std::vector<int>&ready,int timeout=3)
    {
        struct timeval tv={timeout,0};
        fd_set tmp=_rfds;
        int ret=select(_maxfd+1,&tmp,nullptr,nullptr,&tv);
        if(ret<0)
        {
            perror("select error");
            return false;
        }else if(ret==0)
        {
            std::cout<<"time out"<<std::endl;
            ready.clear();
            return true;
        }else
        {
            for(int i=0;i<=_maxfd;++i)
            {
                if(FD_ISSET(i,&tmp))
                {
                    ready.push_back(i);
                }
            }
            return true;
        }
    }
};